#include "msgsocket.h"
#include "command.h"
#include <QDebug>
#include <QHostAddress>

msgsocket::msgsocket(QObject *parent) : QObject(parent)
{
    m_nId = "";

    m_tcpSocket = new QTcpSocket(this);

    connect(m_tcpSocket, SIGNAL(readyRead()),
            this, SLOT(SlotReadyRead()));
    connect(m_tcpSocket, SIGNAL(connected()),
            this, SLOT(SlotConnected()));
    connect(m_tcpSocket, SIGNAL(disconnected()),
            this, SLOT(SlotDisconnected()));
}

msgsocket::~msgsocket()
{
    SlotSendOffline();
}

//// 获取用户账号
QString msgsocket::GetUserId() const
{
    return m_nId;
}

//// 设置用户账号
void msgsocket::SetUserId(const QString &id)
{
    m_nId = id;
}

//// 检查连接
void msgsocket::CheckConnected()
{
    if (m_tcpSocket->state() != QTcpSocket::ConnectedState)
    {
        m_tcpSocket->connectToHost("localhost",55555);
    }
}

//// 关闭连接
void msgsocket::ColseConnected()
{
    if (m_tcpSocket->isOpen())
    {
        m_tcpSocket->abort();
    }
}

//// 连接服务器
void msgsocket::ConnectToHost(const QString &host, const int &port)
{
    qDebug() << host << ", " << port;
    if (m_tcpSocket->isOpen())
    {
        m_tcpSocket->abort();
    }
    m_tcpSocket->connectToHost(host, port);
}

void msgsocket::ConnectToHost(const QHostAddress &host, const int &port)
{
    if (m_tcpSocket->isOpen()) m_tcpSocket->abort();
    m_tcpSocket->connectToHost(host, port);
}

//// socket消息发送封装
void msgsocket::SlotSendMessage(const quint8 &type, const QJsonValue &dataVal)
{
     /// 如果没连接服务器，先连接服务器
     if (!m_tcpSocket->isOpen())
     {
         /// 此处是从配置文件读取，后期实现》》》》》
         m_tcpSocket->connectToHost("localhost", 55555);
//         m_tcpSocket->connectToHost(Config::m_strHostAddr, Config::m_nMsgPort);
//         m_tcpSocket->waitForConnected(1000);
     }
     // 超时1s后还是连接不上，直接返回
     if (!m_tcpSocket->isOpen()) return;

     // 构建 Json 对象
     QJsonObject json;
     json.insert("type", type);     /// 发送消息类型
     json.insert("from", m_nId);    /// 谁发的
     json.insert("data", dataVal);  /// 数据

     // 构建 Json 文档
     QJsonDocument document;
     document.setObject(json);
     m_tcpSocket->write(document.toJson(QJsonDocument::Compact));

     qDebug() << "msgsocket::SlotSendMessage";

}

//// 发送上线通知
void msgsocket::SlotSendOnline()
{

}

//// 发送下线通知
void msgsocket::SlotSendOffline()
{

}

//// 与服务器断开链接
void msgsocket::SlotDisconnected()
{
    qDebug() << "has disconnecetd";
    m_tcpSocket->abort();
    emit signalStatus(DisConnectedHost);
}

//// 链接上服务器
void msgsocket::SlotConnected()
{
    qDebug() << "has connecetd";
    emit signalStatus(ConnectedHost);
}

//// tcp消息处理
void msgsocket::SlotReadyRead()
{
    qDebug() << "cilent::msgsocket::SlotReadyRead()";
    /// 读取socket数据
    QByteArray byRead = m_tcpSocket->readAll();
    QJsonParseError jsonError;
    /// 转化为 JSON 文档
    QJsonDocument doucment = QJsonDocument::fromJson(byRead, &jsonError);
    qDebug() << doucment;

    /// 解析未发生错误
    if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))
    {

        /// JSON 文档为对象
        if (doucment.isObject()) {
            /// 转化为对象
            QJsonObject jsonObj = doucment.object();

            /// 取出服务器发来消息的 类型值
            int nType = jsonObj.value("type").toInt();
            /// 取出服务器发来的消息
            QJsonValue dataVal = jsonObj.value("data");

            /// 根据消息类型解析服务器消息
            switch (nType) {
            case Register:          ParseReister(dataVal); break;
            case Login:             ParseLogin(dataVal); break;
            case GetUserInfo:       ParseInitInfo(dataVal); break;           ///获取初始化信息
            case GetShoppingList:   ParseShoppingInfo(dataVal);break;    ///获取商城列表信息
            case GetShoppingCar:    ParseShoppingCarList(dataVal); break; ///获取购物车信息
            case JoinShoppingCar:   ParseJoinShoppingCar(dataVal); break;///加入购物车结果
            case GetOrderForm:      ParseOrderFormList(dataVal); break;
            case RemoveFromCar:     ParseRemoveFromCar(dataVal); break;
            case BuyNow:            ParseBuyNow(dataVal); break;
            case RemoveOrderForm:   ParseRemoveOrderForm(dataVal); break;
            case ModifyUserInfo:    ParseModifyUserInfo(dataVal); break;
            case ChatWithSb:        ParseChatWithSb(dataVal);       break;
            case GetFriendsList:    ParseGetFriendsList(dataVal);   break;
            case GetFriendsInfo:    ParseGetFriendsInfo(dataVal); break;
            case SendGoods:         ParseSendGoods(dataVal); break;
            case GetPicture:        ParseGetPicture(dataVal); break;
//            case SendMsg: emit signalMessage(SendMsg, dataVal); break;
//            case SendGroupMsg: emit signalMessage(SendGroupMsg, dataVal); break;
//            case SendFile: emit signalMessage(SendFile, dataVal); break;
//            case SendPicture: emit signalMessage(SendPicture, dataVal); break;
            default:
                break;
            }
        }
    }
}

//// 解析登陆返回信息
//// 收到的信息 code：状态码
void msgsocket::ParseLogin(const QJsonValue &dataVal)
{
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();

        /// 解析从服务器发送回来的信息
        int code = dataObj.value("code").toInt();   //// 状态码
        qDebug() << "收到服务器发来的状态码......" << 0;

        if(0 == code)
        {
            emit signalStatus(LoginSuccess);
        }else if( 1 == code)
        {
            emit signalStatus(LoginPasswdError);
        }else if( 2 == code)
        {
            emit signalStatus(LoginNotFound);
        }
    }
}

//// 解析注册返回信息
void msgsocket::ParseReister(const QJsonValue &dataVal)
{
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();
//        m_nId = dataObj.value("id").toInt();

        /// 解析从服务器发送回来的信息
        int code = dataObj.value("code").toInt();   //// 状态码
        qDebug() << "收到服务器发来的注册状态码......" << code;
       if(0 == code)
       {
            emit signalStatus(RegisterOk);
       }else if(-1 == code)
       {
            emit signalStatus(RegisterFailed);
       }
    }
}

//// 解析初始化客户端界面信息 -- 用户信息
void msgsocket::ParseInitInfo(const QJsonValue &dataVal)
{
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();
        /// 解析从服务器发送回来的信息
        QVector<QString> UserInfo;
        UserInfo.append(dataObj.value("AccountNumber").toString());
        UserInfo.append(dataObj.value("Password").toString());
        UserInfo.append(dataObj.value("PetName").toString());
        UserInfo.append(dataObj.value("HeadPhoto").toString());
        UserInfo.append(dataObj.value("Sex").toString());
        UserInfo.append(dataObj.value("Name").toString());
        UserInfo.append(dataObj.value("MobilePhone").toString());
        UserInfo.append(dataObj.value("ShippingAddress").toString());
        UserInfo.append(dataObj.value("Type").toString()); //// 买家商家？

        m_nId = dataObj.value("AccountNumber").toString(); //// 保存用户账号
        m_nType = dataObj.value("Type").toString();        //// 保存用户类型

        //// 将解析结果发送至客户端
        emit signalMessage(GetUserInfo,UserInfo);

        //// 收完个人信息 请求 服务器发送商城信息
        QJsonObject jsonObj;
        SlotSendMessage(GetShoppingList,jsonObj);

//        qDebug() << "收到服务器发来的初始化客户端信息......" << UserInfo;
    }
}

//// 解析初始化客户端界面信息 -- 商城信息
void msgsocket::ParseShoppingInfo(const QJsonValue &dataVal)
{
    // data 的 value 是对象
    if (dataVal.isObject()) {

        QJsonObject dataObj = dataVal.toObject();
        QVector<QString> PhoneList;

        for(int i = 0; i < dataObj.length();i++)
        {
            PhoneList.append(dataObj.value(QString("%1").arg(i)).toString());
//            qDebug() <<  dataObj.value(QString("%1").arg(i)).toString();
        }

        //// 将解析结果发送到客户端界面
        emit signalMessage(GetShoppingList,PhoneList);


        //// 收完商城信息 请求 服务器发送购物车信息
        QJsonObject jsonObj;
        jsonObj.insert("name",m_nId);
        SlotSendMessage(GetShoppingCar,jsonObj);

    }
}

/// 解析购物车列表信息
void msgsocket::ParseShoppingCarList(const QJsonValue &dataVal)
{
    if(m_nType == "买家")
    {
        // data 的 value 是对象
        if (dataVal.isObject()) {

            QJsonObject dataObj = dataVal.toObject();
            QVector<QString> ShoppingCarList;

            for(int i = 0; i < dataObj.length();i++)
            {
                ShoppingCarList.append(dataObj.value(QString("%1").arg(i)).toString());
            }

            //// 将解析结果发送到客户端界面
            emit signalMessage(GetShoppingCar,ShoppingCarList);
        }
    }

    //// 收完商城信息 请求 服务器发送订单信息
    QJsonObject jsonObj;
    jsonObj.insert("Type",m_nType);
    SlotSendMessage(GetOrderForm,jsonObj);

}

/// 解析获取订单列表信息
void msgsocket::ParseOrderFormList(const QJsonValue &dataVal)
{
    // data 的 value 是对象
    if (dataVal.isObject()) {

        QJsonObject dataObj = dataVal.toObject();
        QVector<QString> OrderFormList;

        for(int i = 0; i < dataObj.length();i++)
        {
            OrderFormList.append(dataObj.value(QString("%1").arg(i)).toString());
        }

        //// 将解析结果发送到客户端界面
        emit signalMessage(GetOrderForm,OrderFormList);


        //// 收完订单信息 请求 服务器发送好友列表
        QJsonObject jsonObj;
        jsonObj.insert("name",m_nId);
        SlotSendMessage(GetFriendsList,jsonObj);
    }
}

//// 解析获取好友列表信息
void msgsocket::ParseGetFriendsList(const QJsonValue &dataVal)
{
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();

        QVector<QString> FriendsList;

        for(int i = 0; i < dataObj.length();i++)
        {
            FriendsList.append(dataObj.value(QString("%1").arg(i)).toString());
        }
        //// 包装返回结果
//        qDebug() << "msgsocket::ParseGetFriendsList" << FriendsList;

        //// 将解析结果发送到客户端界面
        emit signalMessage(GetFriendsList,FriendsList);
    }
}

/// 解析加入购物车信息
void msgsocket::ParseJoinShoppingCar(const QJsonValue &dataVal)
{
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();
        QVector <QString> m_Flag;
        QString Flag = dataObj.value("Flag").toString();

        //// 包装返回结果
        m_Flag.append(Flag);
        //// 将解析结果发送到客户端界面
        emit signalMessage(JoinShoppingCar,m_Flag);
    }
}

/// 解析从购物车删除商品函数
void msgsocket::ParseRemoveFromCar(const QJsonValue &dataVal)
{
    qDebug() << "msgsocket::ParseRemoveFromCar";
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();
        QVector<QString> Str;
        Str.append(dataObj.value("Foods").toString());
        Str.append(dataObj.value("Price").toString());
        //// 包装返回结果

        //// 将解析结果发送到客户端界面
        emit signalMessage(RemoveFromCar,Str);
    }
}

/// 解析立即购买
void msgsocket::ParseBuyNow(const QJsonValue &dataVal)
{
    qDebug() << "msgsocket::ParseBuyNow";
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();
        QVector<QString> Str;
        Str.append(dataObj.value("Flag").toString());
        //// 包装返回结果

        //// 将解析结果发送到客户端界面
        emit signalMessage(BuyNow,Str);
    }
}

/// 解析删除订单函数
void msgsocket::ParseRemoveOrderForm(const QJsonValue &dataVal)
{
    qDebug() << "msgsocket::ParseBuyNow";
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();
        QVector<QString> Str;
        Str.append(dataObj.value("Flag").toString());
        //// 包装返回结果

        //// 将解析结果发送到客户端界面
        emit signalMessage(RemoveOrderForm,Str);
    }
}

/// 解析修改信息返回值
void msgsocket::ParseModifyUserInfo(const QJsonValue &dataVal)
{
    qDebug() << "msgsocket::ParseModifyUserInfo";
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();
        QVector<QString> Str;
        Str.append(dataObj.value("Flag").toString());
        //// 包装返回结果

        //// 将解析结果发送到客户端界面
        emit signalMessage(ModifyUserInfo,Str);
    }
}

//// 解析聊天内容
//
void msgsocket::ParseChatWithSb(const QJsonValue &dataVal)
{
    qDebug() << "msgsocket::ParseChatWithSb";
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();
        QVector<QString> Str;

        Str.append(dataObj.value("From").toString());       ///发那
        Str.append(dataObj.value("Where").toString());      ///谁发的
        Str.append(dataObj.value("FriendsName").toString());
        Str.append(dataObj.value("Content").toString());    ///内容
        //// 包装返回结果

        //// 将解析结果发送到客户端界面
        emit signalMessage(ChatWithSb,Str);
    }
}

//// 解析获取到的好友信息
//
void msgsocket::ParseGetFriendsInfo(const QJsonValue &dataVal)
{
    qDebug() << "msgsocket::ParseGetFriendsInfo";
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();
        QVector<QString> UserInfo;

        UserInfo.append(dataObj.value("AccountNumber").toString());
        UserInfo.append(dataObj.value("Password").toString());
        UserInfo.append(dataObj.value("PetName").toString());
        UserInfo.append(dataObj.value("HeadPhoto").toString());
        UserInfo.append(dataObj.value("Sex").toString());
        UserInfo.append(dataObj.value("Name").toString());
        UserInfo.append(dataObj.value("MobilePhone").toString());
        UserInfo.append(dataObj.value("ShippingAddress").toString());
        //// 包装返回结果

        //// 将解析结果发送到客户端界面
        emit signalMessage(GetFriendsInfo,UserInfo);
    }
}

//// 解析发货状态是否更新成功
void msgsocket::ParseSendGoods(const QJsonValue &dataVal)
{
    // data 的 value 是对象
    if (dataVal.isObject()) {

        QJsonObject dataObj = dataVal.toObject();
        QVector<QString> UserInfo;
        UserInfo.append(dataObj.value("Flag").toString());

        //// 将解析结果发送到客户端界面
        emit signalMessage(SendGoods,UserInfo);
    }
}



//// 解析 收图片
void msgsocket::ParseGetPicture(const QJsonValue &dataVal)
{
//    qDebug() << "msgsocket::ParseGetPicture";


//    QDataStream in(m_tcpSocket);
//    in.setVersion(QDataStream::Qt_4_6);

//    if(m_tcpBlockSize == 0)
//    {
//        if(m_tcpSocket->bytesAvailable()<sizeof(quint16))
//            return;

//        in >> m_tcpBlockSize;
//    }

//    if(m_tcpSocket->bytesAvailable() < m_tcpBlockSize)
//        return;

//    QImage image;
//    QByteArray byteArray;
//    in >> byteArray;
//    image.loadFromData(byteArray);  //这个就是存进去的QImage了

//    m_tcpBlockSize = 0;
}

